package com.example.tomatotodo.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import com.example.tomatotodo.model.TodoRecordSyncDTO;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class RecordUtil {
    private static final String TAG = "RecordUtil";
    private static final String PREFS_NAME = "focus_records_prefs";
    private static final String RECORDS_KEY = "focus_records";
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

    // 使用静态Gson实例，避免重复创建
    private static final Gson gson = new GsonBuilder()
            .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter())
            .create();

    /**
     * 将专注记录保存到SharedPreferences
     *
     * @param context 上下文
     * @param record  要保存的记录
     */
    public static void saveRecordToPreferences(Context context, TodoRecordSyncDTO record) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();

        // 获取现有的记录列表
        String recordsJson = prefs.getString(RECORDS_KEY, "[]");
        Type listType = new TypeToken<List<TodoRecordSyncDTO>>() {
        }.getType();
        List<TodoRecordSyncDTO> records = gson.fromJson(recordsJson, listType);

        // 如果列表为空，则创建一个新列表
        if (records == null) {
            records = new ArrayList<>();
        }

        // 添加新记录到列表
        records.add(record);

        // 将更新后的列表转换为JSON并保存
        String updatedRecordsJson = gson.toJson(records);
        editor.putString(RECORDS_KEY, updatedRecordsJson);
        editor.apply();

        Log.d(TAG, "saveRecordToPreferences: 记录已保存到SharedPreferences，当前共有 " + records.size() + " 条记录");
    }

    /**
     * 获取特定任务的所有记录
     *
     * @param context 上下文
     * @param taskId  任务ID
     * @return 该任务的所有记录列表
     */
    public static List<TodoRecordSyncDTO> getRecordsByTaskId(Context context, String taskId) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);

        // 获取现有的记录列表
        String recordsJson = prefs.getString(RECORDS_KEY, "[]");
        Type listType = new TypeToken<List<TodoRecordSyncDTO>>() {
        }.getType();
        List<TodoRecordSyncDTO> records = gson.fromJson(recordsJson, listType);

        // 如果列表为空，则返回空列表
        if (records == null) {
            return new ArrayList<>();
        }

        // 筛选出特定任务的记录，处理可能为null的taskId
        return records.stream()
                .filter(record -> {
                    // 处理taskId可能为null的情况
                    if (record.getTaskId() == null) {
                        return false;
                    }
                    return taskId.equals(record.getTaskId());
                })
                .collect(Collectors.toList());
    }

    /**
     * 获取特定任务的已完成记录
     *
     * @param context 上下文
     * @param taskId  任务ID
     * @return 该任务的已完成记录列表
     */
    public static List<TodoRecordSyncDTO> getCompletedRecordsByTaskId(Context context, String taskId) {
        SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);

        // 获取现有的记录列表
        String recordsJson = prefs.getString(RECORDS_KEY, "[]");
        Type listType = new TypeToken<List<TodoRecordSyncDTO>>() {
        }.getType();
        List<TodoRecordSyncDTO> records = gson.fromJson(recordsJson, listType);

        // 如果列表为空，则返回空列表
        if (records == null) {
            return new ArrayList<>();
        }

        // 筛选出特定任务的已完成记录
        return records.stream()
                .filter(record -> taskId.equals(record.getTaskId()) && Boolean.TRUE.equals(record.getFinished()))
                .collect(Collectors.toList());
    }

    /**
     * 获取配置了LocalDateTime序列化和反序列化支持的Gson实例
     *
     * @return Gson实例
     */
    public static Gson getGsonInstance() {
        return gson;
    }

    /**
     * LocalDateTime的序列化和反序列化适配器
     */
    private static class LocalDateTimeAdapter implements JsonSerializer<LocalDateTime>, JsonDeserializer<LocalDateTime> {
        @Override
        public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) {
            return new JsonPrimitive(src != null ? FORMATTER.format(src) : null);
        }

        @Override
        public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            if (json.isJsonNull() || !json.isJsonPrimitive()) {
                return null;
            }
            try {
                return LocalDateTime.parse(json.getAsString(), FORMATTER);
            } catch (Exception e) {
                Log.w(TAG, "无法解析LocalDateTime: " + json.getAsString(), e);
                return null;
            }
        }
    }
}
